package actions;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import tablemodels.ExpertModel;
import utils.Expert;

import gui.util.EditExpertFrame;

/**
 * 
 * @author dernasherbrezon
 *
 */
public class ExpertCreator extends WizardStep
{
	//TODO работать с темповыми экспертами и только после вызова корректности введённых значений по экспертам добавлять их в MainFrame
	private ArrayList<Expert> experts;
	private JTable expertsTable = new JTable();
	public ExpertCreator(ArrayList<Expert> experts)
	{
		this.experts = experts;
		
		expertsTable.setModel(new ExpertModel(experts));
		expertsTable.getTableHeader().setReorderingAllowed(false);
		
		setLayout(new BorderLayout());
		add(new JLabel("Состав подгруппы:"),BorderLayout.NORTH);
		JScrollPane sp = new JScrollPane(expertsTable);
		add(sp,BorderLayout.CENTER);
		add(createExpertControlButtons(),BorderLayout.EAST);
	}
	
	@Override
	public
	void checkInputValues() throws Exception
	{
		checkExpert(Expert.CALC_EXPERT);
		checkExpert(Expert.LEADER_EXPERT);
		checkExpert(Expert.LOGIC_EXPERT);
		checkExpert(Expert.SECRETARY_EXPERT);
	}

	private JPanel createExpertControlButtons()
	{
		JPanel retValue = new JPanel();
		BoxLayout bl = new BoxLayout(retValue,BoxLayout.PAGE_AXIS);
		retValue.setLayout(bl);
		
		//retValue.add(Box.createVerticalGlue());
		retValue.add(new JButton(new AbstractAction("Добавить эксперта")
		{
			public void actionPerformed(ActionEvent arg0)
			{
				new EditExpertFrame(ExpertCreator.this);
			}
		}));
		retValue.add(new JButton(new AbstractAction("Редактировать профиль эксперта")
		{
			public void actionPerformed(ActionEvent arg0)
			{
				int selIndex = expertsTable.getSelectedRow();
				if(selIndex==-1)
				{
					return;
				}
				Expert selExpert = ((ExpertModel)expertsTable.getModel()).getExpert(selIndex);
				new EditExpertFrame(ExpertCreator.this,selExpert);
			}
		}));
		retValue.add(new JButton(new AbstractAction("Удалить эксперта")
		{
			public void actionPerformed(ActionEvent arg0)
			{
				removeSelectedExpert();
			}
		}));
		
		retValue.add(Box.createVerticalGlue());
		return retValue;
	}
	
	public void addExpert(Expert expert)
	{
		experts.add(expert);
		refresh();
	}
	
	public void removeSelectedExpert()
	{
		int selIndex = expertsTable.getSelectedRow();
		if(selIndex==-1)
		{
			return;
		}
		experts.remove(selIndex);
		refresh();
	}
	
	public void refresh()
	{
		((ExpertModel)expertsTable.getModel()).fireTableDataChanged();
	}
	
	private void checkExpert(String expertRole) throws Exception
	{
		int numRepeats = 0;
		for(int i=0;i<experts.size();i++)
		{
			if(experts.get(i).role.equals(expertRole))
			{
				numRepeats++;
			}
		}
		if(numRepeats==0)
		{
			throw new Exception("Эксперт с ролью \"" + expertRole + "\" не добавлен в команду");
		}
		if(numRepeats>1)
		{
			throw new Exception("Эксперт с ролью \"" + expertRole + "\" добавлен больше одного раза");
		}		
	}

	@Override
	public void makeActions()
	{
	}

	@Override
	public void preShow()
	{
	}
}
